﻿#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <list>
#include<fstream>
using namespace std;

////3.1 C++标准IO流
//// 类型转换
//// 1、内置类型之间，相近类型可以转换 
//// 2、构造函数，其他类型转换成自定义类型，有构造函数就可以支持
////    自定义类型 <- 内置类型  自定义类型 <- 自定义类型
//// 3、operator type()  内置类型 <- 自定义类型
//
//// 自定义类型 <- 内置类型
//class C {
//public:
//	C(int x) {}
//};
//
//// 自定义类型 <- 自定义类型
//class D {
//public:
//	D(const C& c) {}
//};
//
//// 内置类型 <- 自定义类型
//class E {
//public:
//	operator int() {
//		// ...
//		return 0;
//	}
//};
//
//int main() {
//	int* p = nullptr;
//	int i = (int)p;
//
//	// 自定义类型 <- 内置类型
//	C c1 = 11;
//	string s1 = "xxxx";
//
//	// 自定义类型 <- 自定义类型
//	D d = c1;
//	list<int> lt;
//	list<int>::const_iterator it = lt.begin();
//
//	// 内置类型 <- 自定义类型
//	E e;
//	int x = e;
//	cout << x << endl;
//
//	return 0;
//}

//class Date {
//	friend ostream& operator << (ostream& out, const Date& d);
//	friend istream& operator >> (istream& in, Date& d);
//public:
//	Date(int year = 1, int month = 1, int day = 1)
//		:_year(year)
//		, _month(month)
//		, _day(day) {
//	}
//	operator bool() {
//		// 这里是随意写的，假设输入_year为0，则结束
//		if (_year == 0)
//			return false;
//		else
//			return true;
//	}
//private:
//	int _year;
//	int _month;
//	int _day;
//};
//istream& operator >> (istream& in, Date& d) {
//	in >> d._year >> d._month >> d._day;
//	return in;
//}
//ostream& operator << (ostream& out, const Date& d) {
//	out << d._year << " " << d._month << " " << d._day;
//	return out;
//}
//// C++ IO流，使用面向对象+运算符重载的方式
//// 能更好的兼容自定义类型，流插入和流提取
//int main() {
//	// 自动识别类型的本质--函数重载
//	// 内置类型可以直接使用--因为库里面ostream类型已经实现了
//	int i = 1;
//	double j = 2.2;
//	cout << i << endl;
//	cout << j << endl;
//	// 自定义类型则需要我们自己重载<< 和 >>
//	Date d(2022, 4, 10);
//	cout << d;
//	while (d) {
//		cin >> d;
//		cout << d;
//	}
//	return 0;
//}



//3.2 C++文件IO流
class Date {
	friend ostream& operator << (ostream& out, const Date& d);
	friend istream& operator >> (istream& in, Date& d);
public:
	Date(int year = 1, int month = 1, int day = 1)
		:_year(year)
		, _month(month)
		, _day(day) {
	}
	operator bool() {
		// 这里是随意写的，假设输入_year为0，则结束
		if (_year == 0) return false;
		else return true;
	}
private:
	int _year;
	int _month;
	int _day;
};
istream& operator >> (istream& in, Date& d) {
	in >> d._year >> d._month >> d._day;
	return in;
}
ostream& operator << (ostream& out, const Date& d) {
	out << d._year << " " << d._month << " " << d._day;
	return out;
}

//写到文件
//从文件读出来
//1.二进制读写
//2.文本读写
struct ServerInfo {
	char _address[32];
	double x;
	Date _date;
};
class BinIO {
public:
	BinIO(const char* filename = "info.bin")
		:_filename(filename) {
	}

	void Write(const ServerInfo& winfo) {
		ofstream ofs(_filename, ofstream::out | ofstream::binary);
		ofs.write((char*)&winfo, sizeof(winfo));
	}

	void Read(ServerInfo& rinfo) {
		ifstream ifs(_filename, ifstream::in | ifstream::binary);
		ifs.read((char*)&rinfo, sizeof(rinfo));
	}
private:
	string _filename;
};

////写
//int main() {
//	ServerInfo winfo = { "192.0.0.1", 12.13, { 2022, 4, 10 } };
//	BinIO bin;
//	bin.Write(winfo);
//	return 0;
//}

//读
int main() {
	ServerInfo rinfo = {};
	BinIO bin;
	bin.Read(rinfo);
	return 0;
}